#include"Stack.h"
typedef int STDataType;
typedef struct Stack  //定义结构体
{
	STDataType* a;    //数据类型
	int top;          //栈顶
	int capacity;     //容量
}ST;

void STInit(ST* ps){
    assert(ps);

    ps->a = NULL;
    ps->capacity = ps->top = 0;
};                     //初始化

void STDestroy(ST* ps){
    assert(ps);
    
    free(ps->a);
    ps->a = NULL;
    ps->capacity = ps->top = 0;  
};                  //销毁


void STPush(ST* ps, STDataType x){
    assert(ps);

    if(ps->top == ps->capacity)   //判断是否需要扩容
    {
        int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
        STDataType* tmp = (STDataType*)realloc(ps->a,newcapacity * sizeof(STDataType));
        if(tmp == NULL)
        {
            perror("realloc fail");
            return;
        }

        ps->a = tmp;
        ps->capacity = newcapacity;
    }    

    ps->a[ps->top] = x;
    ps->top++;
};       //插入数据

void STPop(ST* ps){
    assert(ps);
    assert(!STEmpty(ps));
    
    ps->top--;
};                      //删除数据
STDataType STTop(ST* ps){
    assert(ps);
    assert(!STEmpty(ps));
    
    return ps->a[ps->top - 1];
};                //获取栈顶元素

int STSize(ST* ps){
    assert(ps);
    
    return ps->top;
};                      //元素个数

bool STEmpty(ST* ps){
    assert(ps);

    return ps->top == 0;
};                    //判断是否为空,为空是true,不为空是false